package homework2;

import java.util.Comparator;

public class Arraysort {
    public static void main(String[] args) {
        //1、声明泛型方法，可以给任意对象数组按照元素的自然排序实现从小到大排序，用冒泡排序实现
        //2、声明泛型方法，可以给任意对象数组按照指定的比较器实现从小到大排序，用冒泡排序实现

        Integer[] arr = {1,5,3,9,2,7,8,4,6};
        sort(arr);
        for (Integer integer : arr) {
            System.out.print(" "+integer);
        }

        sort(arr,Comparator.naturalOrder());
        System.out.println("自然排序");
        for (Integer integer : arr) {
            System.out.print(" "+integer);
        }
        System.out.println("反转后");
        reverse(arr);
        for (Integer integer : arr) {
            System.out.print(" "+integer);
        }
    }
    //1、声明泛型方法，可以给任意对象数组按照元素的自然排序实现从小到大排序，用冒泡排序实现
    public static <T extends Comparable<T>> void sort(T[] arr){
        for (int i = 0; i < arr.length; i++) {
            boolean flag = true;//假设有序
            for (int j = 0; j < arr.length-i-1; j++) {
                if (arr[j].compareTo(arr[j+1])>0){
                    T temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    flag = false;
                }
            }
            if (flag){
                break;
            }
        }
    }
    //2、声明泛型方法，可以给任意对象数组按照指定的比较器实现从小到大排序，用冒泡排序实现
    public static <T> void sort(T[] arr, Comparator<? super T> c){
        for (int i = 0; i < arr.length; i++) {
            boolean flag = true;//假设有序
            for (int j = 0; j < arr.length-i-1; j++) {
                if (c.compare(arr[j],arr[j+1])>0){
                    T temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    flag = false;
                }
            }
            if (flag){
                break;
            }
        }
    }
    //1、声明泛型方法，可以接收一个任意引用类型的数组，并反转数组中的所有元素
    public static <T extends Comparable<T>> void reverse(T[] arr){
        for (int i = 0; i < arr.length / 2; i++) {
            T temp = arr[i];
            arr[i] = arr[arr.length-1-i];
            arr[arr.length-1-i] = temp;
        }
//        int left = 0;//左指针
//        int right = arr.length-1;//右指针
//        while (left < right){//循环结束条件
//            T temp = arr[left];
//            arr[left] = arr[right];
//            arr[right] = temp;
//            left++;
//            right--;
//        }
    }
}
